package br.com.bancoeXtreme;

import controle.Frame;
 import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ClienteSocketExemplo{

	Socket requestSocket; // Socket do cliente
	ObjectOutputStream out; // Fluxos de saida
 	ObjectInputStream in; // Fluxo de entrada
 	String message; // Mensagem
        Frame frame;

	ClienteSocketExemplo(){}
        
	void run() throws ClassNotFoundException
	{
		try{
			//1. Criando um Socket para conectar na porta local 2004
                        // em que o servidor está ouvindo
			requestSocket = new Socket("localhost", 2004);
                        // Assim que a conexão foi aceita
			System.out.println("Conectado com"+ requestSocket.getLocalAddress() + " na porta " + requestSocket.getPort());
			//2. Obtem fluxos de entrada e saida
			out = new ObjectOutputStream(requestSocket.getOutputStream());
			out.flush(); // Descarrega o buffer

                        in = new ObjectInputStream(requestSocket.getInputStream());
			//3: Comunicação com o servidor

                        do{
				try{
					// Le mensagem recebida sucesso de conexão
                                        message = (String)in.readObject();
					System.out.println("Servidor>" + message);

                                        // Envia mensagem
                                       frame = new Frame();
                                       frame.setFim();
                                       sendMessage(frame);
					
				}
				catch(ClassNotFoundException classNot){
					System.err.println("Dados não recebidos corretamente");
				}
			} while(!frame.isFim());

                // Le mensagem recebida sucesso de conexão
                message = (String)in.readObject();
                System.out.println("Servidor>" + message);
		}
		catch(UnknownHostException unknownHost){
			System.err.println("Host desconhecido!");
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
		finally{
			//4: Encerrando a conexão com servidor
			try{
				in.close(); // Fecha o fluxo de saída
				out.close(); // Fecha o fluxo de entrada
				requestSocket.close(); // Fecha conexão com servidor
			}
			catch(IOException ioException){
				ioException.printStackTrace();
			}
		}
	}
	void sendMessage(Frame frame)
	{
		try{
                        // Envia mensagem pelo fluxo de saida
			out.writeObject(frame);
			out.flush(); // Descarregar o buffer

			System.out.println("Cliente>" + frame.getCodMessage());
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
	}
	public static void main(String args[])
	{
		ClienteSocketExemplo client = new ClienteSocketExemplo();
        try {
            client.run();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ClienteSocketExemplo.class.getName()).log(Level.SEVERE, null, ex);
        }
	}
}
